home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / kcl / akcl / akcl1615.lha / c / bsearch.c < prev    next >
C/C++ Source or Header  |  1989-07-28  |  660b  |  36 lines

  1.       
  2.       
  3. char *
  4. bsearch(key,base,nel,keysize,compar)
  5.       char *key,*base;
  6.       unsigned int nel,keysize;
  7.       int (*compar)();
  8. {
  9.   char *beg=base;
  10.   char *end=base+keysize*(nel-1);
  11.   char *mid;
  12.   int cmp,tem;
  13.  top:
  14.   if (nel==0) return 0;
  15.   cmp=(*compar)(beg,key);
  16.   if (cmp==0) return beg;
  17.   if (cmp> 0) return 0;
  18.   cmp= (*compar)(key,end);
  19.   if (cmp==0) return end;
  20.   if (cmp> 0)return 0;
  21.   /* key is in range from here on */
  22.  start:
  23.   if (nel<=2) return 0;
  24.   tem=nel;
  25.   nel=nel/2;
  26.   mid=beg+(nel)*keysize;
  27.   cmp= (*compar)(key,mid);
  28.   if (cmp==0) return mid;
  29.   if (cmp< 0) {end=mid; nel++;
  30.            goto start;;
  31.          }
  32.   beg=mid;
  33.   nel=tem-(nel);
  34.   goto start;
  35. }
  36.